﻿using IOP.SgrA.GLSL;
using IOP.SgrA.SilkNet.Vulkan;
using IOP.SgrA.SilkNet.Vulkan.Scripted;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace VkSample1211
{
    [ShaderVersion("460")]
    [GLSLExtension("GL_ARB_separate_shader_objects : enable")]
    [GLSLExtension("GL_ARB_shading_language_420pack : enable")]
    public partial class CommonFrag : GLSLFrag
    {

        [ShaderInput(0)]
        public vec2 vTexPosition { get; set; }
        [ShaderInput(1)]
        public vec4 inLightQD { get; set; }
        [FragOutput(0, false)]
        public vec4 outColor { get; set; }
        const float maxIterations = 99.0f;//最大迭代次数
        const float zoom = 0.5f;//缩放系数
        const float xCenter = 0.0f;//中心坐标位置
        const float yCenter = 0.0f;
        vec3 innerColor = new vec3(0.0f, 0.0f, 1.0f);//内部颜色
        vec3 outerColor1 = new vec3(1.0f, 0.0f, 0.0f);
        vec3 outerColor2 = new vec3(0.0f, 1.0f, 0.0f);

        public override void main()
        {
            float real = vTexPosition.x * zoom + xCenter;//变换当前位置
            float imag = vTexPosition.y * zoom + yCenter;
            float cReal = 0.32f;//c的实部
            float cImag = 0.043f;//c的虚部
            float r2 = 0.0f;//半径的平方
            float i;//迭代次数
            for (i = 0.0f; i < maxIterations && r2 < 4.0f; i++)
            {//循环迭代
                float tmpReal = real;//保存当前实部值
                real = (tmpReal * tmpReal) - (imag * imag) + cReal;//计算下一次迭代后实部的值
                imag = 2.0f * tmpReal * imag + cImag;//计算下一次迭代后虚部的值
                r2 = (real * real) + (imag * imag);//计算半径的平方
            }
            vec3 color;
            if (r2 < 4.0)
            {//如果r2未达到4就退出了循环，表明迭代次数已达到最大值
                color = innerColor;//为内部颜色赋值
            }
            else
            {//如果因r2大于4.0而退出循环，表明此位置在外部
                color = mix(outerColor1, outerColor2, fract(i * 0.07f));//按迭代次数为外部颜色赋不同的值
            }
            outColor = new vec4(color, 1.0f) * inLightQD;
        }
    }
}
